package PVI;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import Principal.Funciones;


public class MetodosPVI {

	
	public static void euler(Funciones unaFuncion, 
							 double unPasoK,
							 double extremoA,
							 double estremoB,
							 double tinicial,
							 double Uinicial){
		
		Collection<Resultado> unaListaResultados = new LinkedList<Resultado>();
		Double t=(tinicial+unPasoK);
		double Unmas1=0;
		double Un=Uinicial;
		double cota = 1.2*estremoB; // Debido al error de maquina
		while (t<=cota){
			Unmas1 = Un + unPasoK * unaFuncion.evaluar(Un ,t);
			Resultado aResultado = new Resultado(Unmas1,t);
			unaListaResultados.add(aResultado);
			/*Preparo siguiente iteracion*/
			t = t + unPasoK;
			Un = Unmas1;
			Unmas1=0;
		}
		
		/*Muestro Resultados*/
		
		Iterator<Resultado> unItResultados = unaListaResultados.iterator();
		while (unItResultados.hasNext()){
			unItResultados.next().mostrar();
		}
	}
	
	
	public static void puntoMedio(Funciones unaFuncion, 
			 double unPasoK,
			 double extremoA,
			 double estremoB,
			 double tinicial,
			 double Uinicial){

		Collection<Resultado> unaListaResultados = new LinkedList<Resultado>();
		Double t=(tinicial+unPasoK);
		double tnmas1medio;
		double Unmas1=0;
		double Unmas1medio=0;
		double Un=Uinicial;
		double cota = 1.2*estremoB; // Debido al error de maquina
		while (t<=cota){
			tnmas1medio = (t+(unPasoK/2));
			Unmas1medio = Un + (unPasoK/2) * unaFuncion.evaluar(Un ,t);
			Unmas1 = Un + unPasoK * unaFuncion.evaluar(Unmas1medio ,tnmas1medio);
			Resultado aResultado = new Resultado(Unmas1,t);
			unaListaResultados.add(aResultado);
			/*Preparo siguiente iteracion*/
			t = t + unPasoK;
			Un = Unmas1;
			Unmas1=0;
		}

		/*Muestro Resultados*/

		Iterator<Resultado> unItResultados = unaListaResultados.iterator();
		while (unItResultados.hasNext()){
			unItResultados.next().mostrar();
		}
	}
	
	
	
}
